package com.cougil.uoc.seghismed.business.impl;

import java.util.List;
import java.util.Set;

import com.cougil.uoc.seghismed.business.MetgeClientService;
import com.cougil.uoc.seghismed.model.Historial;
import com.cougil.uoc.seghismed.model.Metge;
import com.cougil.uoc.seghismed.model.Pacient;
import com.cougil.uoc.seghismed.model.Usuari;
import com.cougil.uoc.seghismed.model.Visita;
import com.cougil.uoc.seghismed.model.ciphed.HistorialCiphed;
import com.cougil.uoc.seghismed.model.ciphed.MetgeCiphed;
import com.cougil.uoc.seghismed.model.ciphed.PacientCiphed;
import com.cougil.uoc.seghismed.model.ciphed.VisitaCiphed;
import com.cougil.uoc.seghismed.model.comunicacions.Resposta;
import com.cougil.uoc.seghismed.model.comunicacions.enums.Resultat;
import com.cougil.uoc.seghismed.utils.SeghismedUtils;
import com.cougil.uoc.seghismed.webservice.MetgeWebService;

/**
 * Classe que implemente el conjunt de principals métodes de negoci l'aplicatiu Metge
 * 
 * @author Ignacio Cougil Jares
 * 
 */
public class MetgeClientServiceImpl extends CoreClientServiceImpl implements MetgeClientService {

	/* (non-Javadoc)
	 * @see com.cougil.uoc.seghismed.business.MetgeClientService#afegirVisita(com.cougil.uoc.seghismed.model.Pacient, com.cougil.uoc.seghismed.model.Visita)
	 */
	@Override
	public void afegirVisita(Pacient pacient, Visita visita) {
		CoreClientServiceImpl.logger.debug("Intentar afegir la visita: [" + visita + "] del pacient ["
				+ pacient + "]");
		Resposta resposta = this.autenticar();
		Visita v = null;
		if (resposta != null && Resultat.OK.equals(resposta.getResultat())) {
			Metge emisor = (Metge) this.getUsuari();
			Usuari destinatari = this.getGestor();
			MetgeCiphed metgeCiphed = this.cipherService.xifrarMetge(emisor, emisor, destinatari);
			PacientCiphed pacientCiphed = this.cipherService.xifrarPacient(pacient, emisor, destinatari);
			VisitaCiphed visitaCiphed = this.cipherService.signarXifrarVisita(visita, emisor, destinatari);
			this.getWebService().afegirVisita(metgeCiphed, pacientCiphed, visitaCiphed);
		}
		CoreClientServiceImpl.logger.debug("Visita obtinguda: [" + v + "]");
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see
	 * com.cougil.uoc.seghismed.business.MetgeClientService#consultarHistorial(com.cougil.uoc.seghismed
	 * .model.Pacient)
	 */
	@Override
	public Historial consultarHistorial(Pacient pacient) {
		CoreClientServiceImpl.logger.debug("Intentar consultar l'historial del pacient: [" + pacient+ "]");
		Resposta resposta = this.autenticar();
		Historial h = null;
		if (resposta != null && Resultat.OK.equals(resposta.getResultat())) {
			Metge emisor = (Metge) this.getUsuari();
			Usuari destinatari = this.getGestor();
			MetgeCiphed metgeCiphed = this.cipherService.xifrarMetge(emisor, emisor, destinatari);
			PacientCiphed pacientCiphed = this.cipherService.xifrarPacient(pacient, emisor, destinatari);
			HistorialCiphed hCiphed = this.getWebService().consultarHistorial(metgeCiphed, pacientCiphed);
			h = this.cipherService.verificarDesxifrarHistorial(hCiphed, emisor);
		}
		CoreClientServiceImpl.logger.debug("Historial obtingut: [" + h + "]");
		return h;
	}

	/* (non-Javadoc)
	 * @see com.cougil.uoc.seghismed.business.MetgeClientService#consultarMetge()
	 */
	@Override
	public Metge consultarMetge() {
		CoreClientServiceImpl.logger.debug("Intentar consultar el metge: [" + this.getUsuari() + "]");
		Resposta resposta = this.autenticar();
		Metge m = null;
		if (resposta != null && Resultat.OK.equals(resposta.getResultat())) {
			Metge emisor = (Metge) this.getUsuari();
			Usuari destinatari = this.getGestor();
			MetgeCiphed metgeCiphed = this.cipherService.xifrarMetge(emisor, emisor, destinatari);
			metgeCiphed = this.getWebService().consultarMetge(metgeCiphed);
			m = this.cipherService.desxifrarMetge(metgeCiphed, emisor);
		}
		CoreClientServiceImpl.logger.debug("Metge obtingut: [" + m + "]");
		return m;
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see
	 * com.cougil.uoc.seghismed.business.MetgeClientService#consultarPacient(com.cougil.uoc.seghismed
	 * .model.Pacient)
	 */
	@Override
	public Pacient consultarPacient(Pacient pacient) {
		CoreClientServiceImpl.logger.debug("Intentar consultar el pacient: [" + pacient + "]");
		Resposta resposta = this.autenticar();
		Pacient p = null;
		if (resposta != null && Resultat.OK.equals(resposta.getResultat())) {
			Metge emisor = (Metge) this.getUsuari();
			Usuari destinatari = this.getGestor();
			MetgeCiphed metgeCiphed = this.cipherService.xifrarMetge(emisor, emisor, destinatari);
			PacientCiphed pacientCiphed = this.cipherService.xifrarPacient(pacient, emisor, destinatari);
			pacientCiphed = this.getWebService().consultarPacient(metgeCiphed, pacientCiphed);
			p = this.cipherService.desxifrarPacient(pacientCiphed, emisor);
		}
		CoreClientServiceImpl.logger.debug("Pacient obtingut: [" + p + "]");
		return p;
	}

	/* (non-Javadoc)
	 * @see com.cougil.uoc.seghismed.business.MetgeClientService#consultarPacients()
	 */
	@Override
	public List<Pacient> consultarPacients() {
		CoreClientServiceImpl.logger.debug("Intentar consultar el conjunt de pacients associats al metge: [" + this.getUsuari()
				+ "]");
		Resposta resposta = this.autenticar();
		List<Pacient> pacients = null;
		if (resposta != null && Resultat.OK.equals(resposta.getResultat())) {
			Metge emisor = (Metge) this.getUsuari();
			Usuari destinatari = this.getGestor();
			MetgeCiphed metgeCiphed = this.cipherService.xifrarMetge(emisor, emisor, destinatari);
			List<PacientCiphed> pacientsXifrats = this.getWebService().consultarPacients(metgeCiphed);
			pacients = this.cipherService.desxifrarPacientsProtegits(pacientsXifrats, emisor);
		}
		CoreClientServiceImpl.logger.debug("Obtinguts " + (pacients != null ? pacients.size() : 0)
				+ " pacients associats al metge: [" + this.getUsuari() + "]");
		return pacients;
	}

	@Override
	public Visita consultarVisita(Pacient pacient, Visita visita) {
		CoreClientServiceImpl.logger.debug("Intentar consultar la visita: [" + visita + "] del pacient ["
				+ pacient + "]");
		Resposta resposta = this.autenticar();
		Visita v = null;
		if (resposta != null && Resultat.OK.equals(resposta.getResultat())) {
			Metge emisor = (Metge) this.getUsuari();
			Usuari destinatari = this.getGestor();
			MetgeCiphed metgeCiphed = this.cipherService.xifrarMetge(emisor, emisor, destinatari);
			PacientCiphed pacientCiphed = this.cipherService.xifrarPacient(pacient, emisor, destinatari);
			VisitaCiphed visitaCiphed = this.cipherService.signarXifrarVisita(visita, emisor, destinatari);
			visitaCiphed = this.getWebService().consultarVisita(metgeCiphed, pacientCiphed, visitaCiphed);
			v = this.cipherService.verificarDesxifrarVisita(visitaCiphed, emisor);
		}
		CoreClientServiceImpl.logger.debug("Visita obtinguda: [" + v + "]");
		return v;
	}

	/* (non-Javadoc)
	 * @see com.cougil.uoc.seghismed.business.MetgeClientService#desxifrarVisitesProtegides(com.cougil.uoc.seghismed.model.Historial)
	 */
	@Override
	public Set<Visita> desxifrarVisitesProtegides(Historial historial) {
		// desxifrem el conjunt de visites signades i xifrades per veure el seu contingut, signades
		// i xifrades pel gestor per al destinatari en qüestió
		Set<Visita> visitesProtegides = this.cipherService.verificarDesxifrarVisitesProtegides(historial
				.getVisitesProtegides(), this.getUsuari());
		SeghismedUtils.logVisites("Visites xifrades i signades", visitesProtegides);
		return visitesProtegides;
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see com.cougil.uoc.seghismed.business.impl.CoreClientServiceImpl#getWebService()
	 */
	@Override
	protected MetgeWebService getWebService() {
		return (MetgeWebService) this.webService;
	}

}
